home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / GW AdaEd 1.4.2 / GWAdaDemos / GWU Demos / creature.adb < prev    next >
Text File  |  1995-04-09  |  3KB  |  95 lines

  1.  
  2. --
  3. --  Implementation of the Creature.  In this case, it is a worm.
  4. --  Charles Kann, The George Washington University
  5. --
  6.  
  7. WITH Screen; USE Screen;
  8. WITH Screen_IO; USE Screen_IO;
  9. WITH Random; USE Random;
  10. PACKAGE BODY Creatures IS
  11.  
  12.     Max_Length : CONSTANT POSITIVE :=6;
  13.     SUBTYPE Length IS POSITIVE RANGE 1..Max_Length;
  14.     TYPE Worm_Definition IS ARRAY(Length) of Coordinate;
  15.  
  16. --
  17. --  New_Direction finds the new direction for the worm to move
  18. --
  19.  
  20.     FUNCTION New_Direction RETURN INTEGER IS
  21.         Direction : Integer;
  22.     BEGIN
  23.         Direction := Random.Random_Int(10);
  24.         IF Direction > 5 THEN
  25.             Direction := -1;
  26.     ELSE
  27.         Direction := 1;
  28.         END IF;
  29.         RETURN Direction;
  30.     END New_Direction;
  31.  
  32. --
  33. --  Move_Worm actually moves the worm 
  34. --
  35.  
  36.     PROCEDURE Move_Worm( Worm_Position : IN OUT Worm_Definition;
  37.                          Symbol : IN Character ) IS
  38.       Temp: String(1..1) := (1 => Symbol);
  39.     BEGIN
  40.  
  41.         Terminal.WriteAt( (Worm_Position(Max_Length).x, 
  42.                           Worm_Position(Max_Length).y), " " );
  43.  
  44.         FOR I in REVERSE 2..Max_Length LOOP
  45.             Worm_Position(I) := Worm_Position(I-1);
  46.             Terminal.WriteAt( (Worm_Position(I).x, Worm_Position(I).y), 
  47.                                Temp );
  48.         END LOOP;
  49.  
  50.         Worm_Position(1).x := Worm_Position(1).x + New_Direction;
  51.         IF Worm_Position(1).x < Minimum_xy.x THEN
  52.             Worm_Position(1).x := Minimum_xy.x;
  53.         END IF;
  54.         IF Worm_Position(1).x > Maximum_xy.x THEN
  55.             Worm_Position(1).x := Maximum_xy.x;
  56.         END IF;
  57.  
  58.         Worm_Position(1).y := Worm_Position(1).y + New_Direction;
  59.         IF Worm_Position(1).y < Minimum_xy.y THEN
  60.             Worm_Position(1).y := Minimum_xy.y;
  61.         END IF;
  62.         IF Worm_Position(1).y > Maximum_xy.y THEN
  63.             Worm_Position(1).y := Maximum_xy.y;
  64.         END IF;
  65.  
  66.         Terminal.WriteAt( (Worm_Position(1).x, Worm_Position(1).y), 
  67.                                Temp );
  68.     END;
  69.  
  70. --
  71. --  This is the body for the worm task.
  72. --
  73.  
  74.     TASK BODY Worm IS
  75.         Worm_Position : Worm_Definition;
  76.         My_Symbol : Character;
  77.     BEGIN
  78.         --
  79.     -- Initialize the symbol for the worm, and the position of the
  80.     -- worm to the upper left hand corner.
  81.     --
  82.         ACCEPT Init_Worm( Symbol : IN Character ) DO
  83.             My_Symbol := Symbol;
  84.         END Init_Worm;
  85.         FOR I in Length LOOP
  86.             Worm_Position(I).x := 1;
  87.             Worm_Position(I).y := 1;
  88.         END LOOP;
  89.  
  90.         LOOP
  91.             Move_Worm( Worm_Position, My_Symbol );
  92.         END LOOP;
  93.     END Worm;
  94. END Creatures;
  95.